import ncu from "npm-check-updates";
import chalk from "chalk";
import fs from "fs";
import {fileURLToPath} from "url";
import {dirname, join} from "path";
import ora from "ora";
const readPackageJson = () => {
 const __filename = fileURLToPath(import.meta.url);
 const __dirname = dirname(__filename);
 try {
  const packagePath = join(__dirname, "..", "package.json");
  const packageData = fs.readFileSync(packagePath, "utf8");
  return JSON.parse(packageData);
 } catch (error) {
  console.error("读取 package.json 失败:", error);
  return null;
 }
};

// 2. 辅助：版本号对比函数（语义化版本：x.y.z）
// 返回值：1（current > latest）、0（相等）、-1（current < latest）
const compareVersions = (current, latest) => {
 const currentParts = current.split(".").map(Number);
 const latestParts = latest.split(".").map(Number);

 for (let i = 0; i < 3; i++) {
  if (currentParts[i] > latestParts[i]) return 1;
  if (currentParts[i] < latestParts[i]) return -1;
 }
 return 0;
};
// 1. 核心：检测版本更新的函数
const checkVersionUpdate = async () => {
 const cliPackageName = "custom-cli"; // 替换为你的 CLI 实际 npm 包名
 const res = await readPackageJson();
 const currentVersion = res.version; // 当前运行的 CLI 版本
 const spinner = ora(`正在检测 ${cliPackageName} 版本更新...`).start();

 try {
  // 使用 ncu 检测指定包的最新版本（仅检测，不修改本地文件）
  const updates = await ncu.run({
   packageFile: "package.json", // 本地 package.json（仅用于 ncu 配置，不实际修改）
   filter: cliPackageName, // 只检测我们的 CLI 包
   silent: true, // 关闭 ncu 自身的日志输出，避免干扰
  });

  spinner.stop();
  console.log(updates, cliPackageName, updates[cliPackageName], "--------");
  // 若检测到更新（updates 对象中存在当前包）
  if (updates[cliPackageName]) {
   const latestVersion = updates[cliPackageName];
   // 对比版本号：若当前版本 < 最新版本，提示升级
   if (compareVersions(currentVersion, latestVersion) < 0) {
    console.log(
     "\n" + chalk.yellowBright(`⚠️  检测到 ${cliPackageName} 有新版本可用！`)
    );
    console.log(chalk.blue(`当前版本：${currentVersion}`));
    console.log(chalk.green(`最新版本：${latestVersion}`));
    console.log(
     chalk.yellow(`请执行以下命令升级：npm install -g ${cliPackageName}@latest`)
    );
    console.log(); // 空行分隔，提升可读性
   } else {
    // console.log(
    //  chalk.green(`✅ ${cliPackageName} 已是最新版本（${currentVersion}）`)
    // );
   }
  } else {
   // 未检测到更新（可能是网络问题或已是最新）
   // console.log(
   //  chalk.green(`✅ ${cliPackageName} 已是最新版本（${currentVersion}）`)
   // );
  }
 } catch (error) {
  spinner.fail(chalk.red("版本检测失败！"));
  console.log(chalk.gray(`原因：${error.message}`));
  console.log();
  // 版本检测失败不阻断后续流程（用户仍可创建项目）
 }
};

export default checkVersionUpdate;
